package com.mezz.bones.framework.web.context;

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.stp.StpUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * @Author: zhuang
 * @Date: 2024/8/15 10:30
 * @Description: TODO
 * @Version: 1.0
 **/

@Slf4j
public class LoginUserContext {

    /**
     * 获取当前登录用户的ID。
     * 如果用户未登录，返回 null。
     *
     * @return 当前登录用户的ID，未登录则返回null
     */
    public static String getCurrentUserIdOrEmpty() {
        try {
            return StpUtil.getLoginIdAsString();
        } catch (NotLoginException e) {
            log.warn("获取用户ID时用户未登录");
            return "";
        }
    }

    /**
     * 获取当前登录用户的ID。
     * 如果用户未登录，抛出 NotLoginException 异常。
     *
     * @return 当前登录用户的ID
     * @throws NotLoginException 如果用户未登录，抛出异常
     */
    public static String getCurrentUserId() throws NotLoginException {
        return StpUtil.getLoginIdAsString();
    }

    /**
     * 获取当前登录用户的 Token。
     * 如果用户未登录，返回 null。
     *
     * @return 当前登录用户的 Token，未登录则返回null
     */
    public static String getCurrentTokenOrNull() {
        try {
            return StpUtil.getTokenValue();
        } catch (NotLoginException e) {
            log.warn("获取用户Token时用户未登录");
            return null;
        }
    }

    /**
     * 获取当前登录用户的 Token。
     * 如果用户未登录，抛出 NotLoginException 异常。
     *
     * @return 当前登录用户的 Token
     * @throws NotLoginException 如果用户未登录，抛出异常
     */
    public static String getCurrentToken() throws NotLoginException {
        return StpUtil.getTokenValue();
    }

    /**
     * 检查当前是否已登录。
     *
     * @return true 如果已登录，否则 false
     */
    public static boolean isLogin() {
        return StpUtil.isLogin();
    }

    /**
     * 强制退出登录
     */
    public static void logoutCurrentUser() {
        if (isLogin()) {
            StpUtil.logout();
        }
    }
}
